package org.wzh.three.jvm.oom;

/**
 * @author ewanhiz
 * String.intern() 返回引用的测试
 */
public class RuntimeConstantPoolOOM2 {

    /**
     * 这段代码在 JDK 1.6 中运行,会得到两个 false.
     * 而在 Java 1.7 中运行,会得到一个 true 和 一个 false.
     *
     * 产生的原因是: 在 Java 1.6 中, intern() 方法会把首次遇到的字符串实例复制到永久代中,返回的也是永久代中这个字符串实例的引用.
     * 而由 StringBuilder 创建的字符串实例在 Java 堆上,所以必然不是同一个引用.将返回 false.
     *
     * 而 JDK 1.7(以及部分其它虚拟机,例如 JRockit)的 intern() 实现不会再复制实例,只是在常量池中记录首次出现的实例引用,因此 intern()
     *
     * 返回的引用和由 StringBuilder创建的那个字符串实例是同一个.对 str2 比较返回 false 是因为 java 这个字符串在执行 StringBuilder()
     * 之前已经出现过,字符串常量池中已经有它的引用了,不符合首次出现的原则,而计算机软件这个字符串则是首次出现的,因此返回 true.
     * @param args
     */
    public static void main(String[] args) {
        String str1 = new StringBuilder("计算机").append("软件").toString();
        System.out.println(str1.intern() == str1);

        String str2 = new StringBuilder("ja").append("va").toString();
        System.out.println(str2.intern() == str2);
    }

}

